/*
New Scotland Yard is an online multiplayer adaptation
of the boardgame "Scotland Yard". Copyright (C) 2011
Massey University Software C Group 3
This program is free software: you can redistribute it
and/or modify it under the terms of the GNU General
Public License as published by the Free Software
Foundation, either version 3 of the License, or (at
your option) any later version.
This program is distributed in the hope that it will
be useful, but WITHOUT ANY WARRANTY; without even the
implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU General Public
License for more details.
You should have received a copy of the GNU General
Public License along with this program. If not, see
<http://www.gnu.org/licenses/>.
*/
package nz.ac.massey.softwarec.group3.reverseAJAX;
import java.util.*;
import java.util.concurrent.*;
import org.directwebremoting.Browser;
import org.directwebremoting.ScriptSessions;
import org.directwebremoting.impl.DaemonThreadFactory;
import org.directwebremoting.ui.dwr.Util;
/**
* ReverseAJAXManager - Singleton class which manages all the ReverseAJAXCalls.
* @version 1.0 Release
* @since 1.0
* @authors Natalie Eustace | Wanting Huang | Paul Smith | Craig Spence
*/
public final class ReverseAJAXManager implements ReverseAJAXManagerInterface
{
private List<ReverseAJAXCall> reverseAJAXCalls = new ArrayList<ReverseAJAXCall>();
private static ReverseAJAXManager reverseAJAXManager;
/**
* Private constructor for Singleton pattern.
*/
private ReverseAJAXManager() {
final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory());
executor.scheduleAtFixedRate(new ReverseAJAXThread(), 1, 100, TimeUnit.MILLISECONDS);
}
/**
* Method which returns the only instance of ReverseAJAXManager, and creates one if it doesn't exist.
* @return ReverseAJAXManager reverseAJAXManager - The single instance of ReverseAJAXManager
*/
public static ReverseAJAXManager getReverseAJAXManager() {
if (reverseAJAXManager == null) {
reverseAJAXManager = new ReverseAJAXManager();
}
return reverseAJAXManager;
}
/*
* Method to perform a ReverseAJAXCall with a certain output, on an element of a page.
* @param ReverseAJAXCall call - The call to be performed across all browsers on a given page.
*/
@Override
public void performReverseAJAXCall(final ReverseAJAXCall call) {
if (call.getFilter() == null) {
if (call.getFunction() == null) {
Browser.withPage(call.getPage(), new Runnable() {
@Override
public void run()
{
Util.setValue(call.getElement(), call.getOutput());
}
});
}
else {
Browser.withPage(call.getPage(), new Runnable() {
@Override
public void run() {
ScriptSessions.addFunctionCall(call.getFunction(), call.getParams());
}
});
}
} else {
if (call.getFunction() == null) {
Browser.withPageFiltered(call.getPage(), call.getFilter(), new Runnable() {
@Override
public void run() {
Util.setValue(call.getElement(), call.getOutput());
}
});
} else {
Browser.withPageFiltered(call.getPage(), call.getFilter(), new Runnable() {
@Override
public void run() {
ScriptSessions.addFunctionCall(call.getFunction(), call.getParams());
}
});
}
}
reverseAJAXCalls = new ArrayList<ReverseAJAXCall>();
}
/*
* Getter for reverseAJAXCalls.
* @return ArrayList<ReverseAJAXCall> - The ArrayList containing all ReverseAJAXCalls.
*/
@Override
public List<ReverseAJAXCall> getReverseAJAXCalls() {
return this.reverseAJAXCalls;
}
/*
* Setter for reverseAJAXCalls.
* @param ArrayList<ReverseAJAXCall> - The ArrayList containing all ReverseAJAXCalls.
*/
@Override
public void setReverseAJAXCalls(final List<ReverseAJAXCall> reverseAJAXCalls){
this.reverseAJAXCalls = reverseAJAXCalls;
}
}